package com.correportuvida.Seguidor;

import java.util.HashSet;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;

import com.correportuvida.ContenedorDeInstancias;
import com.correportuvida.consumo.ModoDeConsumo;
import com.correportuvida.consumo.ModoDeConsumoAlto;
import com.correportuvida.plan.Entrenamiento;
import com.correportuvida.posicion.ActualizadorDePosicion;

public class SeguidorDeEntrenamiento {

	private Entrenamiento unEntrenamiento;
	private ActualizadorDePosicion unActualizador;
	private Timer unTimer = new Timer();
	private Set<ObservadorDeFases> subscriptos;
	private ModoDeConsumo unModoDeConsumo;
	
	public SeguidorDeEntrenamiento(ActualizadorDePosicion unActualizador) {
		this.unActualizador = unActualizador;
		this.unModoDeConsumo = new ModoDeConsumoAlto();
		this.subscriptos = new HashSet<ObservadorDeFases>();
	}
	
	public void entrenar(Entrenamiento unEntrenamiento) {
		this.unEntrenamiento = unEntrenamiento;
		this.onTimer();
	}

	public void onTimer() {
		if (this.unEntrenamiento.tieneMasFases()) {
			this.unTimer.schedule(new TimerTask() {
				
				@Override
				public void run() {
					SeguidorDeEntrenamiento.this.onTimer();
				}
				
			}, unEntrenamiento.proximaFase().getDuracionFase());
		}else{
			ContenedorDeInstancias.instance().getActividadDeMapa().finalizarAutomatico();
			this.unActualizador.detener();
			//TODO: otro sprint: guardar datos del entrenamiento en Estadisticas
		}
				
		for (ObservadorDeFases unObservador : subscriptos) {
			unObservador.actualizar(this);
		}
	}
	
	public void terminarManual() {
		this.unTimer.cancel();
		this.actualizador().detener();
	}
		
	public void subscribir(ObservadorDeFases unObservador) {
		this.subscriptos.add(unObservador);
	}
	
	public ActualizadorDePosicion actualizador() {
		return this.unActualizador;
	}
	
	public Entrenamiento entrenamiento() {
		return this.unEntrenamiento;
	}
	
	public ModoDeConsumo modoDeConsumo() {
		return this.unModoDeConsumo;
	}
	
	public void setModoDeConsumo(ModoDeConsumo unModoDeConsumo) {
		this.unModoDeConsumo = unModoDeConsumo;
	}
	
}
